vi Contents
Using Multiple Routers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
Extracting Routers into Files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
Go Further . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
Routing on the Accept Header . . . . . . . . . . . . . . . . . . . . . . . . . . 36
4 Working with Request Bodies 39
Request Body Lifecycle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
Reading Request Bodies . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
Finishing Up the Create Endpoint . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
Update and Delete . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
Express .route() Method . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50
Go Further . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
II Middleware 53
5 Middleware 55
Cross Cutting with Middleware . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56
Passing Data to Routes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
Route Middleware . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
Middleware is Everywhere . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64
Go Further . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65
Error Handling Middleware . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65
6 Common Middleware 67
Logging with Morgan . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67
Body Parser . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68
Middleware Factories . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69
Compression . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70
Serving a Frontend . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72
File Uploads with Multer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74
Serving Static Files with a Path Prefix . . . . . . . . . . . . . . . . . . . . . . . . . 78
Accepting Multiple Body Types . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79
Go Further . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81
URL Encoded Bodies . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81
PATCH Things Up . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81
MIME Types . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82
III Authentication & Authorization 83
7 Basic Authentication 85
Authorization Header . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85
Handling Authentication with Middleware . . . . . . . . . . . . . . . . . . . . . . 87
Graceful Global Middleware . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90
Requiring Authentication . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92
Creating a Middleware Factory . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94
Currying and Middleware Factories . . . . . . . . . . . . . . . . . . . . . . . . . . 95
Prepared exclusively for vladislava semernina